import { defineConfig } from '@tarojs/cli'
import fs from 'fs-extra'
import path from 'path'

import devConfig from './dev'
import prodConfig from './prod'

import ComponentsPlugin from 'unplugin-vue-components/webpack'
// import AutoImport from 'unplugin-auto-import/webpack'
import NutUIResolver from '@nutui/auto-import-resolver'


// webpack 配置
const commonChain = (chain) => {
    // 自动导入
    // https://github.com/antfu/unplugin-auto-import
    // chain.plugin('unplugin-auto-import').use(
    //     AutoImport({
    //         // 你可以指定要自动导入的库  
    //         imports: [
    //             'vue',
    //             // https://vuejs.org/guide/extras/reactivity-transform.html#refs-vs-reactive-variables
    //             // 'vue/macros',
    //         ],
    //         // 自动生成 ts 声明文件的位置
    //         dts: 'types/auto-imports.d.ts',
    //         // 自动导入方法所在的文件目录- 这里添加 utils 和 store
    //         dirs: ['src/utils', 'src/stores'],
    //         vueTemplate: true,
    //     }),
    // )
    chain.plugin('unplugin-vue-components').use(ComponentsPlugin({
        resolvers: [NutUIResolver({ taro: true })]
    }))
}
  


// https://taro-docs.jd.com/docs/next/config#defineconfig-辅助函数
export default defineConfig(async (merge, { command, mode }) => {
  const baseConfig = {
    projectName: 'taro-vue3',
    date: '2023-7-25',
    designWidth: 375,
    deviceRatio: {
      640: 2.34 / 2,
      750: 1,
      375: 2,
      828: 1.81 / 2
    },
    sourceRoot: 'src',
    outputRoot: 'dist',
    plugins: [
      '@tarojs/plugin-html',
      [
        '@tarojs/plugin-framework-vue3',
        {
          vueLoaderOption: {
            compilerOptions: {
              isCustomElement: tag => tag.includes('taro-scroll-view-core'),
              whitespace: 'preserve'
            }
          }
        }
      ]
    ],
    alias: {
      '@/*': path.resolve(__dirname, '..', 'src/*'),
    },
    sass: {
      data: `@import "@nutui/nutui-taro/dist/styles/variables.scss";`
    },
    defineConstants: {
    },
    copy: {
      patterns: [
      ],
      options: {
      }
    },
    framework: 'vue3',
    compiler: {
      type: 'webpack5',
      prebundle: { enable: false }
    },
    cache: {
      enable: false // Webpack 持久化缓存配置，建议开启。默认配置请参考：https://docs.taro.zone/docs/config-detail#cache
    },
    mini: {
      postcss: {
        pxtransform: {
          enable: true,
          config: {

          }
        },
        url: {
          enable: true,
          config: {
            limit: 1024 // 设定转换尺寸上限
          }
        },
        cssModules: {
          enable: false, // 默认为 false，如需使用 css modules 功能，则设为 true
          config: {
            namingPattern: 'module', // 转换模式，取值为 global/module
            generateScopedName: '[name]__[local]___[hash:base64:5]'
          }
        }
      },
      webpackChain(chain) {
        if (fs.existsSync(path.resolve(__dirname, '../FinClipConf.js'))) {
          chain.plugin('copyRootConfig')
            .use(require('copy-webpack-plugin'), [{ patterns: [{ from: 'FinClipConf.js', noErrorOnMissing: true }] }])
        }
        commonChain(chain),
        chain.merge({
          module: {
            rule: [
              {
                test: /.js$/,
                loader: 'babel-loader'
              }
            ]
          }
        })
        chain.merge({
            performance: {
                // 入口起点的最大体积 限制 500kb
                maxEntrypointSize: 51200,
                // 生成文件的最大体积
                maxAssetSize: 51200
            }
        })
      }
    },
    h5: {
      webpackChain(chain) {
        chain.plugin('unplugin-vue-components').use(ComponentsPlugin({
          resolvers: [NutUIResolver({taro: true})]
        }))
      },
      publicPath: '/',
      staticDirectory: 'static',
      output: {
        filename: 'js/[name].[hash:8].js',
        chunkFilename: 'js/[name].[chunkhash:8].js'
      },
      miniCssExtractPluginOption: {
        ignoreOrder: true,
        filename: 'css/[name].[hash].css',
        chunkFilename: 'css/[name].[chunkhash].css'
      },
      postcss: {
        autoprefixer: {
          enable: true,
          config: {}
        },
        cssModules: {
          enable: false, // 默认为 false，如需使用 css modules 功能，则设为 true
          config: {
            namingPattern: 'module', // 转换模式，取值为 global/module
            generateScopedName: '[name]__[local]___[hash:base64:5]'
          }
        }
      }
    },
    rn: {
      appName: 'taroDemo',
      postcss: {
        cssModules: {
          enable: false, // 默认为 false，如需使用 css modules 功能，则设为 true
        }
      }
    }
  }
  // cross-env NODE_ENV=dev
  if (process.env.NODE_ENV === 'dev') {
    // 本地开发构建配置（不混淆压缩）
    return merge({}, baseConfig, devConfig)
  }
  // 生产构建配置（默认开启压缩混淆等）
  return merge({}, baseConfig, prodConfig)
})
